/*
 * Copyright (c) 2022  by Junzhao
 * THIS FILE IS PART OF JAVASE Song Huongkang PROJECT
 * All Rights Reserved.
 */

package 学习.中.多态性;
/**
 * @description 多态性
 *    向上转型类
 *    从而实现多态 称为虚拟方法调用 （类比于自动类型提升）
 *    父类的引用 指向 子类的对象
 *    编译看左边，运行看右边。
 *    使用前提 方法重写 类的继承
 *    多态性 不适用于属性 不能调用子类特有的方法
 *    多态性是一个运行时行为
 *
 *
 *      向下转型 （类比于强制类型转换）
 *
 *      instanceof的使用
 *
 *
 * @author 俊昭
 * @date 2022/3/27
*/
public class PolymorphismTest {
    // 在该类的 main() 方法中首先声明 Figure 类的变量 figure，
    // 然后分别为 figure 变量指定不同的对象，并调用这些对象的 area() 方法。
    public static void main(String[] args) {
        Figure figure; // 声明Figure类的变量
        figure = new Rectangle(9, 9);
        System.out.println(figure.area());// 调用的方法是自己的类内重写的
        System.out.println("===============================");
        figure = new Triangle(6, 8);
        System.out.println(figure.area());// 调用的方法是自己的类内重写的
        System.out.println("===============================");
        figure = new Figure(10, 10);
        System.out.println(figure.area());// 调用的方法是自己的类的
        System.out.println("===============================");

        // 执行结果如下
        /*
         长方形的面积：
         81.0
         ===============================
         三角形的面积：
         24.0
         ===============================
         父类中计算对象面积的方法，没有实际意义，需要在子类中重写。
         0.0
        */
    // 无论 figure 变量的对象是 Rectangle 还是 Triangle
    // 它们都是 Figure 类的子类，因此可以向上转型为该类，从而实现多态。

        //向下转型

        //将父类对象赋给子类
//        Triangle t1 = (Triangle) f1;// ClassCastException类转换异常


        // instanceof使用
        // ture需要下对上不可以平行

         Figure f1 =new Figure();
         Figure f2 =new Triangle();
         Triangle t2 = new Triangle();
         Rectangle r2 = new Rectangle();
        System.out.println(f1 instanceof Figure);// f1 是Figure的对象
        System.out.println(f2 instanceof Figure);// f2 是Figure的对象
        System.out.println(t2 instanceof Figure);// t2 是Figure的子类的对象
//        System.out.println(t2 instanceof Rectangle); 为同一个类的子类之间不可以
    }
}
class Figure {
    double dim1;
    double dim2;

    Figure(double d1, double d2) {
        // 有参的构造方法
        this.dim1 = d1;
        this.dim2 = d2;
    }

    public Figure() {

    }

    double area() {
        // 用于计算对象的面积
        System.out.println("父类中计算对象面积的方法，没有实际意义，需要在子类中重写。");
        return 0;
    }
}
class Rectangle extends Figure {//矩形
    Rectangle(double d1, double d2) {
        super(d1, d2);
    }

    public Rectangle() {

    }

    double area() {
        System.out.println("长方形的面积：");
        return super.dim1 * super.dim2;
    }
}
class Triangle extends Figure {//三角形
    Triangle(double d1, double d2) {
        super(d1, d2);
    }

    public Triangle() {

    }

    double area() {
        System.out.println("三角形的面积：");
        return super.dim1 * super.dim2 / 2;
    }
}